#ifndef prsTest_CalcExpr_H
#define prsTest_CalcExpr_H

#include "prs_CalcExpr.h"

namespace prsTestCalcExpr {

/**********************
///////////////////////////////////////////////////////////////////////////////

struct TNodeNumber : public prs::TNodeCalc
{
  static char *attrValue() { return "value";}
  double Value;
  //
  TNodeNumber() { Value = 0;}
  //
  virtual TNode *New()  { return new TNodeNumber;}
  virtual double Calc() { return Value;}
  //
  virtual svl::TInfoParam AddInfoTo(svl::TInfoParam Info)
  {
    return TNode::AddInfoTo(Info) 
     .Add(attrValue(),Value)
    ;
  }
};

///////////////////////////////////////////////////////////////////////////////

struct TRuleParam : public snt::TRule
{
  TRuleParam(snt::text::TContext &Context,svl::TVariant &Parent)
  :parent(Parent)
  {
    This = this;

    snt::text::TNumber Number(Context);
    snt::TFVoid        F;
    snt::TReturn       Return;

    // this -> Number -> Return
   *this
    | Number.New(vNumber) & F.New(&FNumber,This) & Return.New()
    ;
  }

private:
  static void FNumber(snt::TParams &Params)
  {
    TRuleParam *This = dynamic_cast<TRuleParam *>(Params.Pop().Pointer());
    prs::TNodeCalc *Parent = dynamic_cast<prs::TNodeCalc*>(This->parent.Pointer());

    TNodeNumber *Node = new TNodeNumber;
      Node->Value = This->vNumber;
    Parent->OldChildren.Array.Add( Node,true );
  }
  //
  svl::TVariant This,&parent,vNumber;
};
***********************************/
///////////////////////////////////////////////////////////////////////////////
void Test();
////////////////////////////////////////////////////////////////////////////////
}

#endif

